#include <string.h>
#include <iostream>
using std::cout;
using std::endl;

class Computer{
public:
    Computer(const char * brand, float price)
    :_brand(new char[strlen(brand) + 1]())
    ,_price(price)
    {
        strcpy(_brand, brand);
        //构造函数中需要添加当前电脑的金额到总金额中
        _totalPrice += _price;
    }

    //析构函数、拷贝构造函数、赋值运算符函数---三合成原则
    ~Computer(){
        if(_brand){
            delete [] _brand;
            _brand = nullptr;
        }
    }
    Computer(const Computer & rhs)
    :_brand(new char[strlen(rhs._brand) + 1]())
    ,_price(rhs._price)
    {
        strcpy(_brand, rhs._brand);
        //使用已知的一台电脑创建一个新的电脑，价格一致的
        //也需要加入到总金额中
        _totalPrice += _price;
    }
    //把原先左操作数金额减去
    //再把有操作数金额加上
    Computer & operator=(const Computer & rhs){
        if(this != &rhs){
            delete [] _brand;
            //把原先的价格减去
            _totalPrice -= _price;
            _brand = new char[strlen(rhs._brand) + 1]();
            strcpy(_brand, rhs._brand);
            _price = rhs._price;
            //把新的价格加上
            _totalPrice += _price;
        }
        return *this;
    }

    //静态成员函数主要的使用场景
    //就是搭配着静态数据成员一起来使用
    //静态成员函数中无法直接用成员的名字
    //访问非静态的成员（数据成员、成员函数）
    //因为访问静态成员函数可以不需要有对象
    //静态成员函数中没有this指针
    //而数据成员和成员函数的访问均需要借助于this指针
    static float getTotalPrice(){
        //print();error
        //cout << _price << endl;
        return _totalPrice;
    }

    void print(){
        cout << "_brand=" << _brand << ",_price=" << _price << endl;
    }
private:
    char * _brand;
    float _price;
    //静态数据成员
    static float _totalPrice;
};
//静态数据成员的初始化放到类的外部进行
float Computer::_totalPrice = 0;

void test(){
    //静态成员函数访问的两种方式
    cout << Computer::getTotalPrice() << endl;
    //Computer c;
    //cout << c.getTotalPrice() << endl;
}

void test2(){
    //每当创建一个新的Computer，始终可以正确的显示总金额
    //借助于常规的构造函数、借助于拷贝构造函数都能够正确处理
    //当赋值的时候也能够正确的处理
    cout << Computer::getTotalPrice() << endl;
    Computer c1("Apple", 12000);
    cout << Computer::getTotalPrice() << endl;
    Computer c2 = c1;
    cout << Computer::getTotalPrice() << endl;
    Computer c3("Huawei", 7000);
    cout << Computer::getTotalPrice() << endl;
    //觉得华为的笔记本写代码还是不如mac方便
    //退了，重新订购了一台mac
    c3 = c1;
    cout << Computer::getTotalPrice() << endl;
}

int main()
{
    test2();
    return 0;
}

